package com.wawu;

import com.wawu.common.IOC.ApplicationContext;
import com.wawu.common.property.AppProperty;
import com.wawu.common.httpHandler.AopRequestHandler;
import jakarta.servlet.ServletContextEvent;
import jakarta.servlet.ServletContextListener;
import jakarta.servlet.annotation.WebListener;
import lombok.Getter;

/**
 * tomcat启动时就会创建，伴随tomcat整个运行周期
 *  - 扫描这个同包及其子包下的类，处理像IOC容器、路由注册等等（类似SpringMVC的启动类）
 *
 *  需要：要在web.xml中注册
 */
@WebListener//改成使用注解的形式注册
public class AppInitializer implements ServletContextListener {
    @Getter
    private static ApplicationContext applicationContext;
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        System.out.println("ServletContextListener完成IOC容器初始化和注册路由...");
        //1.扫描当前包及其子包进行IOC容器初始化
        System.out.println("AppInitializer类所在包:"+this.getClass().getPackage().getName());//输出自己所在的包
        applicationContext = new ApplicationContext(this.getClass().getPackage().getName(), AppProperty.ANNOTATION_PACKAGE);//注意：额外指定了注解的位置
                //TODO 待优化：这里扫描的是指定包的注解
        //2.注册路由，需要前面IOC容器中@RestController修饰的对象
        System.out.println("注册路由：");
        AopRequestHandler.initializeRoutes(applicationContext); // 注册路由
        //3.注册全局异常处理器
        System.out.println("注册全局异常处理器：");
        AopRequestHandler.initializeExceptionHandlers(applicationContext);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        // 清理资源等操作
        System.out.println("ApplicationContext destroyed.");
    }
}
